<?php
/**
 * Created by PhpStorm.
 * User: qixiuxiu
 * Date: 2017/4/5
 * Time: 15:44
 */
require_once __DIR__ . '/../vendor/autoload.php';//包容这个文件，可以允许类被自动加载

use Symfony\Component\HttpFoundation\Request;//引入请求类
use Symfony\Component\HttpFoundation\Response;//引入返回类
use Symfony\Component\Routing;//引入routing路由

function render_template($request){
    extract($request->attributes->all(),EXTR_SKIP);
    ob_start();
    include sprintf(__DIR__.'/../src/pages/%s.php',$_route);
    return new Response(ob_get_clean());//获取当前缓冲区内容到response并删除当前的输出缓冲区
}
$request = Request::createFromGlobals();//createFromGlobals()方法基于当前PHP全局变量创建了一个Request对象。
$routes = include __DIR__ . '/../src/app.php';//获得路由配置文件

//UrlMatcher实例能够匹配URL路径
$context = new Routing\RequestContext();
$context->fromRequest($request);
$matcher = new Routing\Matcher\UrlMatcher($routes,$context);
/*//作为一个约定，对于每个路由来说，其关联的控制器被配置在_controller这个路由属性中（route attribute）
$routes->add('hello', new Routing\Route('/hello/{name}', array(
    'name' => 'World',
//    '_controller' => 'render_template',
    '_controller' => function ($request) {
//        return render_template($request);}
        // $foo will be available in the template
        // $foo 可用于模板中
        $request->attributes->set('foo', 'bar');

        $response = render_template($request);

        // change some header 修改头信息
        $response->headers->set('Content-Type', 'text/plain');

        return $response;}
)));*/
//URL matcher在匹配不到路由时会抛出一个异常
try{
//    extract($matcher->match($request->getPathInfo()),EXTR_SKIP);
//    ob_start();//打开缓冲区
//    include sprintf(__DIR__.'/../src/pages/%s.php',$_route);
//
//    $response = new Response(ob_get_clean());//获取当前缓冲区内容到response并删除当前的输出缓冲区

    /*
     *渲染的完成依靠的是一个外部函数（render_template()） 对它传入提取自URL的属性（attributes）。*/
    $request->attributes->add($matcher->match($request->getPathInfo()));
    $response = call_user_func('render_template',$request);

}catch (Routing\Exception\ResourceNotFoundException $e){
    $response = new Response('Not Found',404);
}catch (Exception $e){
    $response = new Response('an error occurred',500);//500错误现已被正确管理；
}

$response->send();
